package OOA.com.JavaBasis.staticpackage;
/*
*
* static修饰成员变量
* static只能修饰成员变量（全局变量）不能修饰局部变量
* static修饰的成员变量后，该变量只能存储在方法区中，而不是堆中
* static修饰的成员变量后，该变量属于类，而不属于对象
* static修饰的成员变量后，所有对象对该成员变量进行操作，都是操作同一个变量
* 原因：
* 原本每个对象都有一套属于自己的成员变量，存储在堆中，而成员变量被static修饰后其就变成类的结构，存储在方法区里
* 同时所有对象对该成员变量进行操作，都是操作同一个变量
* static修饰的成员变量的调用格式： 类名.成员变量
*
*
* static修饰成员方法
* 静态方法只能被继承不能被重写【静态是属于类的结构，只能有一份！】
* 静态方法不能访问非静态变量的原因：
*           因为静态方法和静态变量都是在类被加载的时候运行的，静态方法在运行时，使用到的变量必须是存在的，
*           而成员变量的出现是在创建对象的时候，创建对象的时期迟于静态方法加载的时期，所以不能访问
*
*
* static块
* static运行时期早于构造方法，因此，我们在开发过程中，要想在创建对象之前，堆某些属性赋值，可以通过静态块来实现
* 运行时期：
*        static块 > 代码块 > 构造方法
* 代码块是属于对象的，在对象创建前运行
* 构造方法在创建对象时执行
*
* */
public class Dog {
    private String name;
    private int age;
    private static int num;

    //静态块
    static{
        num = 0;
        System.out.println("静态块开始了");
    }
    //代码块
    {
        System.out.println("代码块开始了");
    }
    //构造方法
    public Dog(){
        System.out.println("构造方法开始了");
    }

    public Dog(int age) {
        this.age = age;
        System.out.println("构造方法开始了");
        System.out.println(++num);
    }

    //静态方法
    public static void show(){
        System.out.println(num);//静态方法访问静态变量
        //System.out.println(age);//静态方法访问非静态变量    编译报错
    }
    //普通方法
    public void method(){
        System.out.println(num);//普通方法访问静态变量
        System.out.println(age);//普通方法访问非静态变量
    }

    public static void main(String[] args) {
        Dog dog1 = new Dog(5);
        Dog dog2 = new Dog(6);

        System.out.println("==========静态块实验============");
        Dog dog3 = new Dog();
    }
}
